package com.xianggu.spring.aop.config;

import java.util.regex.*;

/**
 * * 被替换为 .*，表示匹配任意数量的字符。
 * ? 被替换为 .，表示匹配任意单个字符。
 * . 被转义为 \.，确保它只匹配字面量的点号。
 */
public class WildcardMatcher {

    /**
     * 将通配符模式转换为正则表达式
     *
     * @param pattern 通配符模式
     * @return 正则表达式
     */
    private static String convertWildcardToRegex(String pattern) {
        StringBuilder regex = new StringBuilder();
        for (char c : pattern.toCharArray()) {
            switch (c) {
                case '*':
                    regex.append(".*"); // * 匹配任意数量的字符
                    break;
                case '?':
                    regex.append(".");  // ? 匹配任意单个字符
                    break;
                case '.':
                    regex.append("\\."); // 转义 .
                    break;
                default:
                    regex.append(Pattern.quote(String.valueOf(c))); // 转义其他字符
                    break;
            }
        }
        return "^" + regex + "$";
    }

    /**
     * 检查字符串是否匹配通配符模式
     *
     * @param input   输入字符串
     * @param pattern 通配符模式
     * @return 是否匹配
     */
    public static boolean matches(String input, String pattern) {
        String regex = convertWildcardToRegex(pattern);
        return Pattern.matches(regex, input);
    }

    /**
     * 检查类的全限定路径是否匹配通配符模式
     *
     * @param className 类的全限定路径
     * @param pattern   通配符模式
     * @return 是否匹配
     */
    public static boolean matchesClass(String className, String pattern) {
        return matches(className, pattern);
    }

    /**
     * 检查方法的全限定路径是否匹配通配符模式
     *
     * @param className  类的全限定路径
     * @param methodName 方法名
     * @param pattern    通配符模式
     * @return 是否匹配
     */
    public static boolean matchesMethod(String className, String methodName, String pattern) {
        String fullMethodPath = className + "." + methodName;
        return matches(fullMethodPath, pattern);
    }

    public static void main(String[] args) {
        // 测试类路径匹配
        System.out.println(matchesClass("com.xianggu.XiangGuController", "com.xianggu.XiangGuController")); // true
        System.out.println(matchesClass("com.xianggu.XiangGuController", "com.xianggu.*")); // true
        System.out.println(matchesClass("com.xianggu.XiangGuController", "com.xianggu.?")); // false

        // 测试方法路径匹配
        System.out.println(matchesMethod("com.xianggu.XiangGuController", "doService", "com.xianggu.XiangGuController.*ervice")); // true
        System.out.println(matchesMethod("com.xianggu.XiangGuController", "doService", "com.xianggu.XiangGuController.?Service")); // false
        System.out.println(matchesMethod("com.xianggu.XiangGuController", "doService", "com.xianggu.XiangGuController.?e?vice")); // true
    }
}